﻿#ifndef __TEST__DYN__MEM__POOL__H
#define __TEST__DYN__MEM__POOL__H

#include <stdlib.h>
#include <string.h>

///	对象个数
enum { __OBJ_NUM_1 = 5000 };
enum { __OBJ_NUM_2 = 2000 };
enum { __OBJ_NUM_3 = 500 };
enum { __OBJ_NUM_4 = 4000 };

static size_t obj_num[4] = 
{
	__OBJ_NUM_1, __OBJ_NUM_2,__OBJ_NUM_3, __OBJ_NUM_4
};

struct TestObj_1
{
	TestObj_1()
	{
		memset(this, 0, sizeof(TestObj_1));
	}
	void setValue(size_t data)
	{
		data_1 = data;
		data_2 = data;
		data_3 = data;
		data_4 = data;
		data_5 = data;
		data_6 = data;
		data_7 = data;
		data_8 = data;
		data_9 = data;
		data_10 = data;
		data_11 = data;
		data_12 = data;
		data_13 = data;
		data_14 = data;
		data_15 = data;
		data_16 = data;
		data_17 = data;
		data_18 = data;
		data_19 = data;
	}

	long long data_1;
	long long data_2;
	long long data_3;
	long long data_4;
	long long data_5;
	long long data_6;
	long long data_7;
	long long data_8;
	long long data_9;
	long long data_10;
	long long data_11;
	long long data_12;
	long long data_13;
	long long data_14;
	long long data_15;
	long long data_16;
	long long data_17;
	long long data_18;
	long long data_19;
};

struct TestObj_2
{
	TestObj_2()
	{
		memset(this, 0, sizeof(TestObj_2));
	}
	void setValue(size_t data)
	{
		data_1 = data;
		data_2 = data;
		data_3 = data;
		data_4 = data;
		data_5 = data;
		data_6 = data;
		data_7 = data;
		data_8 = data;
		data_9 = data;
		data_10 = data;
		data_11 = data;
		data_12 = data;
		data_13 = data;
		data_14 = data;
		data_15 = data;
		data_16 = data;
		data_17 = data;
		data_18 = data;
		data_19 = data;
		data_20 = data;
		data_21 = data;
		data_22 = data;
		data_23 = data;
	}

	long long data_1;
	long long data_2;
	long long data_3;
	long long data_4;
	long long data_5;
	long long data_6;
	long long data_7;
	long long data_8;
	long long data_9;
	long long data_10;
	long long data_11;
	long long data_12;
	long long data_13;
	long long data_14;
	long long data_15;
	long long data_16;
	long long data_17;
	long long data_18;
	long long data_19;
	long long data_20;
	long long data_21;
	long long data_22;
	long long data_23;
};

struct TestObj_3
{
	TestObj_3()
	{
		memset(this, 0, sizeof(TestObj_3));
	}
	void setValue(size_t data)
	{
		data_1 = data;
		data_2 = data;
		data_3 = data;
		data_4 = data;
		data_5 = data;
		data_6 = data;
		data_7 = data;
		data_8 = data;
		data_9 = data;
		data_10 = data;
		data_11 = data;
		data_12 = data;
		data_13 = data;
		data_14 = data;
		data_15 = data;
		data_16 = data;
		data_17 = data;
		data_18 = data;
		data_19 = data;
		data_20 = data;
		data_21 = data;
		data_22 = data;
		data_23 = data;
		data_24 = data;
		data_25 = data;
	}

	long long data_1;
	long long data_2;
	long long data_3;
	long long data_4;
	long long data_5;
	long long data_6;
	long long data_7;
	long long data_8;
	long long data_9;
	long long data_10;
	long long data_11;
	long long data_12;
	long long data_13;
	long long data_14;
	long long data_15;
	long long data_16;
	long long data_17;
	long long data_18;
	long long data_19;
	long long data_20;
	long long data_21;
	long long data_22;
	long long data_23;
	long long data_24;
	long long data_25;
};

struct TestObj_4
{
	TestObj_4()
	{
		memset(this, 0, sizeof(TestObj_4));
	}
	void setValue(size_t data)
	{
		data_1 = data;
		data_2 = data;
		data_3 = data;
		data_4 = data;
		data_5 = data;
		data_6 = data;
		data_7 = data;
		data_8 = data;
		data_9 = data;
		data_10 = data;
		data_11 = data;
		data_12 = data;
		data_13 = data;
		data_14 = data;
		data_15 = data;
		data_16 = data;
		data_17 = data;
		data_18 = data;
		data_19 = data;
		data_20 = data;
		data_21 = data;
		data_22 = data;
		data_23 = data;
		data_24 = data;
		data_25 = data;
		data_26 = data;
		data_27 = data;
		data_28 = data;
		data_29 = data;
	}

	long long data_1;
	long long data_2;
	long long data_3;
	long long data_4;
	long long data_5;
	long long data_6;
	long long data_7;
	long long data_8;
	long long data_9;
	long long data_10;
	long long data_11;
	long long data_12;
	long long data_13;
	long long data_14;
	long long data_15;
	long long data_16;
	long long data_17;
	long long data_18;
	long long data_19;
	long long data_20;
	long long data_21;
	long long data_22;
	long long data_23;
	long long data_24;
	long long data_25;
	long long data_26;
	long long data_27;
	long long data_28;
	long long data_29;
};

class TestDynMemPool
{
public:
	enum
	{
		__TYPE_RAND = 0,
		__TYPE_EVERY,
	};

public:
	TestDynMemPool();
	~TestDynMemPool();

	/// 分配空间
	void Alloc(int type, bool pool = true);

	/// 释放空间
	void Dealloc(int type, bool pool = true);

	/// 暴力测试
	void ViolenceTest(size_t n, int type = __TYPE_RAND, bool pool = true);

private:
	TestObj_1* m_pObj1[__OBJ_NUM_1];
	TestObj_2* m_pObj2[__OBJ_NUM_2];
	TestObj_3* m_pObj3[__OBJ_NUM_3];
	TestObj_4* m_pObj4[__OBJ_NUM_4];
};

#endif	/// __TEST__DYN__MEM__POOL__H